Using sysconf in Ruby with FFI (Update)
2012-10-16
Turns out I was wrong yesterday and what I got was garbage.
So let's do it right today, but unfortunately this is going to be a lot less pretty than I'd hoped for. Also, this is going to use a C compiler in the backround every time you run it. Might be worth caching.
require 'ffi'
require 'ffi/tools/const_generator'
module Sysconf
extend FFI::Library
ffi_lib ["c"]
fcg = FFI::ConstGenerator.new do |gen|
gen.include 'unistd.h'
%w[
_SC_PAGE_SIZE
_SC_VERSION
].each do |const|
ruby_name = const.sub(/^_SC_/, '').downcase.to_sym
gen.const(const, "%d", nil, ruby_name, &:to_i)
end
end
CONF = enum(*fcg.constants.map{|_, const|
[const.ruby_name, const.converted_value]
}.flatten)
attach_function :sysconf, [CONF], :long
end
p page_size: Sysconf.sysconf(:page_size)
p version: Sysconf.sysconf(:version)